Análise de Vendas Fermac Representações
¶

1 Definação do problema¶

Como aumentar as vendas? (elaborar uma introdução passeando sobre a problemática)¶

  • Quais são nossas suposições sobre o mercado?
  • Em quanto podemos aumentar as vendas?
  • Por que perdemos negócios?
  • Quem são os principais concorrentes e porque perdemos vendas para eles?
  • Quais são os fatores externos que influenciam nos negócios?
  • Quais são os clientes que podemos aumentar vendas, como podemos encontrar novos clientes?
  • Como podemos aumentar a venda para clientes existentes, que ações devemos tomar?
  • Podemos aumentar as vendas com rentabilidade nesses clientes?
  • Estamos perdendo clientes, quais são os motivos?
  • Quais são os materiais que mais temos chance de vender?

2 Como os dados se apresentam e de onde vem ? (explanar sobre como os dados estão estruturados e como podem ser combinados com outros afim de que algumas hipóteses sejam testadas e observadas.)¶

  • Elaborar um resumo dos dados
  • Comportamento de vendas por mês/ano.
  • Meses com melhor desempenho.
  • Número de clientes mensais, variação/tempo.
  • Volume de vendas por cliente.
  • Volume de vendas por tipo de material
  • Preço médio dos materiais.
  • De quais segmentos são os clientes que compram?

3 Importando os dados¶

In [1]:
# Import libraries and modules
import pandas as pd
import numpy as np
import requests
import openai

#https://stackoverflow.com/questions/20625582/how-to-deal-with-settingwithcopywarning-in-pandas
pd.options.mode.chained_assignment = None # default='warn'

from bs4 import BeautifulSoup as bs
from pandas import Series, DataFrame
from datetime import datetime, timedelta
import matplotlib.pylab as plt
import seaborn as sns
import decimal
from decimal import Decimal
import re
plt.style.use('ggplot')

Importanto informações sobre notas fiscais salvas como csv em load_csv¶

In [2]:
sales_data = pd.read_csv('./data/csv_files/sales_data.csv')

Um olhar sobre as primeiras linhas:

In [3]:
sales_data.head()
Out[3]:
Data NF Est Pedido Cliente Descrição Esp Larg Comp Preço_pç Preço_kg Quantidade Total
0 01-06-2007 0319203 11 1223-30 JRIND. CHAPA GR LTQ DEC 6,30 NBR8300 OL 6,3000 1.200,0000 3.000,0000 0,00 2,53 1.456,00 3.867,86
1 01-06-2007 0319202 11 3350-20 JRIND. CHAPA FQ DEC 4,25 NBR6658 OL 4,2500 1.200,0000 3.000,0000 0,00 2,35 3.081,00 7.602,37
2 01-06-2007 0319187 11 4737-10 FORMA CHAPA FF 0,60 NBR6658 OL 0,6000 1.200,0000 1.850,0000 0,00 2,85 2.129,00 6.371,03
3 01-08-2007 0323897 11 9477-10 ENIOSCARIOT CHAPA FQ 2,00 SEGUNDA QUALIDADE 2,0000 1.000,0000 3.000,0000 0,00 2,20 1.281,00 2.959,11
4 01-08-2007 0323897 11 9477-20 ENIOSCARIOT CHAPA FQ 2,65 SEGUNDA QUALIDADE 2,6500 1.000,0000 3.000,0000 0,00 2,15 664,00 1.498,98

Um olhar sobre as ultimas linhas:

In [4]:
sales_data.tail()
Out[4]:
Data NF Est Pedido Cliente Descrição Esp Larg Comp Preço_pç Preço_kg Quantidade Total
19134 31-08-2023 331524 11 357068-10 SASPLASTI TIRA ZC BOB 0,50 NBR7008 ZC CR NO REV 0,5000 78,0000 0,0000 0,00 8,92 2.876,00 26.487,67
19135 31-08-2023 331525 11 357491-10 FLANTECH TIRA ZC BOB 1,25 NBR7008 ZC CR MI REV 1,2500 23,5000 0,0000 0,00 9,95 3.217,00 33.049,45
19136 31-08-2023 331525 11 357101-20 FLANTECH TIRA ZC BOB 1,25 NBR7008 ZC CR MI REV 1,2500 32,0000 0,0000 0,00 9,95 569,00 5.845,55
19137 31-08-2023 84291 14 359882-10 ACOPLANO BOB AL/ZN 0,50 ASTM A792 CN C/TQ ACA 0,5000 1.200,0000 0,0000 0,00 7,50 16.140,00 124.984,13
19138 31-10-2023 334868 11 363346-10 METMETALCIN TIRA FF BOB 0,25 G2L290 BbOL SMODI 0,2500 47,0000 0,0000 0,00 9,95 2.250,00 23.115,09

Os dados importados abrangem os anos de 2007 a 2023

Importando informações sobre produtos¶

In [5]:
products = pd.read_csv('./data/csv_files/products.csv')
In [6]:
products.head()
Out[6]:
Descrição Tipo de Produto Comissão Família Produto
0 BLANK CL FF OL 0,75 NBR 6658 BKFF 2% BLANK
1 BLANK CL FF OL 0,90 NBR 6658 BKFF 2% BLANK
2 BLANK CL FF OL 1,20 NBR 6658 BKFF 2% BLANK
3 BLANK CL FF OL 1,50 NBR 6658 BKFF 2% BLANK
4 BLANK CL FF OL 1,90 NBR 6658 BKFF 2% BLANK

Como as colunas "Descrição" nos conjuntos de dados sales_data e products contém o mesmo tipo de informação, serão usadas para mesclar os dois conjuntos de dados a fim de obter informações mais categorizadas sobre os produtos. As colunas "Cod" e "Unnamed" não fazem sentido manter, então as eliminaremos posteriormente.

Inspecionando os tipos de dados em sales_data:

In [7]:
sales_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 19139 entries, 0 to 19138
Data columns (total 13 columns):
 #   Column      Non-Null Count  Dtype 
---  ------      --------------  ----- 
 0   Data        19139 non-null  object
 1   NF          19139 non-null  object
 2   Est         19139 non-null  object
 3   Pedido      19139 non-null  object
 4   Cliente     19139 non-null  object
 5   Descrição   19139 non-null  object
 6   Esp         19139 non-null  object
 7   Larg        19139 non-null  object
 8   Comp        19139 non-null  object
 9   Preço_pç    19139 non-null  object
 10  Preço_kg    19139 non-null  object
 11  Quantidade  19139 non-null  object
 12  Total       19139 non-null  object
dtypes: object(13)
memory usage: 1.9+ MB

Serão necessárias algumas alterações nos tipos de dados para realizar uma manipulação adequada dos dados. Por exemplo, o campo "Data", precisa ser convertido para o formato de data e hora (Datetime). À primeira vista, também observamos que a quantidade de valores não nulos é praticamente inexistente em todos os campos do conjunto de dados.

Inspecionando os tipos de dados em products:

In [8]:
products.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2790 entries, 0 to 2789
Data columns (total 4 columns):
 #   Column           Non-Null Count  Dtype 
---  ------           --------------  ----- 
 0   Descrição        2790 non-null   object
 1   Tipo de Produto  2790 non-null   object
 2   Comissão         2790 non-null   object
 3   Família Produto  2790 non-null   object
dtypes: object(4)
memory usage: 87.3+ KB

O campo "Comissão" precisa ser convertido para o formato numérico. Os campos Unnamed devem ser eliminados.

4 Limpeza e Preparação de Dados¶

Eliminar colunas desnecessárias e atribuir tipos de dados apropriados para garantir cálculos precisos. Isso inclui remover quaisquer valores NaN (ausentes) e verificar duplicatas nos dados.

Ao remover colunas desnecessárias, podemos simplificar o DataFrame e focar apenas nas informações relevantes. Isso ajuda a reduzir a confusão e a melhorar a eficiência das análises subsequentes.

Atribuir tipos de dados apropriados às colunas é importante para garantir cálculos precisos e interpretações significativas. Por exemplo, colunas numéricas devem ser atribuídas aos tipos de dados numéricos corretos (por exemplo, int ou float), colunas de data devem ser atribuídas ao tipo de dados datetime, e colunas categóricas devem ser atribuídas ao tipo de dados categoria.

Remover valores NaN é crucial para garantir que os dados estejam limpos e completos. Valores NaN podem prejudicar cálculos e análises, portanto, é importante lidar com eles adequadamente, seja imputando valores ausentes ou excluindo linhas com dados faltantes, dependendo do contexto específico e dos requisitos.

Verificar duplicatas ajuda a identificar entradas redundantes ou repetidas nos dados. Ao identificar e remover duplicatas, você pode garantir que cada ponto de dados seja único e evitar distorcer os resultados de suas análises.

Ao executar essas etapas nesta fase, termos um DataFrame refinado otimizado para cálculos precisos, análises significativas e insights confiáveis.

Converter Data para o formato datetime e verificar valores nulos:¶

In [9]:
#sales_data ['Data'] = pd.to_datetime(sales_data['Data'])
sales_data['Data'] = pd.to_datetime(sales_data['Data'], format='%d-%m-%Y')
print(sales_data['Data'].isnull().sum())
0

Converter Preço_kg para o formato numerico float¶

In [10]:
sales_data['Preço_kg'] = sales_data['Preço_kg'].apply(lambda x: str(x.split()[0].replace(',', '.')))
sales_data['Preço_kg'] = sales_data['Preço_kg'].apply(lambda x: float(x.strip().replace('None', '0.00')))
#pd.set_option('display.max_rows', None)  # Set the maximum number of rows to display
print(sales_data['Preço_kg'])
0        2.53
1        2.35
2        2.85
3        2.20
4        2.15
         ... 
19134    8.92
19135    9.95
19136    9.95
19137    7.50
19138    9.95
Name: Preço_kg, Length: 19139, dtype: float64

Converter Preço_pç para o formato numerico float¶

In [11]:
sales_data['Preço_pç'] = sales_data['Preço_pç'].apply(lambda x: str(x.split()[0].replace(',', '.')))
sales_data['Preço_pç'] = sales_data['Preço_pç'].apply(lambda x: float(x.strip().replace('None', '0.00')))
#pd.set_option('display.max_rows', None)  # Set the maximum number of rows to display
print(sales_data['Preço_pç'])
0        0.0
1        0.0
2        0.0
3        0.0
4        0.0
        ... 
19134    0.0
19135    0.0
19136    0.0
19137    0.0
19138    0.0
Name: Preço_pç, Length: 19139, dtype: float64

Converter Quantidade para o formato numerico int¶

In [12]:
sales_data['Quantidade'] = sales_data['Quantidade'].apply(lambda x: str(x.split()[0].replace('.', '')))
sales_data['Quantidade'] = sales_data['Quantidade'].apply(lambda x: re.sub(r'(\,\d\d)', '', x))
sales_data['Quantidade'] = sales_data['Quantidade'].apply(lambda x: int(x.strip().replace('None', '0')))
sales_data['Quantidade'] = sales_data['Quantidade'].astype(int)
print(sales_data['Quantidade'])
0         1456
1         3081
2         2129
3         1281
4          664
         ...  
19134     2876
19135     3217
19136      569
19137    16140
19138     2250
Name: Quantidade, Length: 19139, dtype: int64

Removendo a coluna Total e criando novamento por ser mais simples e direto do que fazer tratamento.

In [13]:
sales_data.drop(['Total'], axis=1, inplace=True)
sales_data['Total'] = sales_data['Preço_kg'] * sales_data['Quantidade']

Descrição tem um espaço em branco na frente, que pode causar problemas quando juntar sales_data e products.

In [14]:
sales_data['Descrição'][0]
Out[14]:
' CHAPA GR LTQ DEC 6,30 NBR8300 OL'

Removendo o esaço em branco na frente da Descrição.

In [15]:
sales_data['Descrição'] = sales_data['Descrição'].str.lstrip()
In [16]:
sales_data.head()
Out[16]:
Data NF Est Pedido Cliente Descrição Esp Larg Comp Preço_pç Preço_kg Quantidade Total
0 2007-06-01 0319203 11 1223-30 JRIND. CHAPA GR LTQ DEC 6,30 NBR8300 OL 6,3000 1.200,0000 3.000,0000 0.0 2.53 1456 3683.68
1 2007-06-01 0319202 11 3350-20 JRIND. CHAPA FQ DEC 4,25 NBR6658 OL 4,2500 1.200,0000 3.000,0000 0.0 2.35 3081 7240.35
2 2007-06-01 0319187 11 4737-10 FORMA CHAPA FF 0,60 NBR6658 OL 0,6000 1.200,0000 1.850,0000 0.0 2.85 2129 6067.65
3 2007-08-01 0323897 11 9477-10 ENIOSCARIOT CHAPA FQ 2,00 SEGUNDA QUALIDADE 2,0000 1.000,0000 3.000,0000 0.0 2.20 1281 2818.20
4 2007-08-01 0323897 11 9477-20 ENIOSCARIOT CHAPA FQ 2,65 SEGUNDA QUALIDADE 2,6500 1.000,0000 3.000,0000 0.0 2.15 664 1427.60
In [17]:
products.head()
Out[17]:
Descrição Tipo de Produto Comissão Família Produto
0 BLANK CL FF OL 0,75 NBR 6658 BKFF 2% BLANK
1 BLANK CL FF OL 0,90 NBR 6658 BKFF 2% BLANK
2 BLANK CL FF OL 1,20 NBR 6658 BKFF 2% BLANK
3 BLANK CL FF OL 1,50 NBR 6658 BKFF 2% BLANK
4 BLANK CL FF OL 1,90 NBR 6658 BKFF 2% BLANK

Mesclando sales_data e products em um único DataFrame.

In [18]:
sales_data = pd.merge(sales_data, products)

5 Web Scraping¶

Vamos analisar a possível correlação entre o preço do Dólar e a variação nos preços dos materiais, para isso é necessário importar a série histórica das flutuações da taxa de câmbio do Dólar em Reais.

Start Web Scraping:

In [20]:
r = requests.get("http://www.ipeadata.gov.br/ExibeSerie.aspx?serid=38590&module=M")

Usar dados salvos em caso de economizar processamento:

In [21]:
dollar_df = pd.read_csv('./data/csv_files/dollar.csv')

Convert to a beautiful soup object:

In [22]:
# soup = bs(r.content)
# soup.prettify()

Mesmo ao usar 'soup.prettify()', que adiciona indentação e quebras de linha, ainda é difícil visualizar a estrutura da página. No entanto, os dados que estamos buscando estão estruturados na forma de uma tabela, como mostrado abaixo. ipea2.png

Ao inspecionar a tabela, é evidente que os dados que estamos buscando, data e valor, são inseridos dentro das tags com um ID que segue o padrão id="grd_DXDataRow0", onde "Rows0" no final indica os dados mais recentes.

Portanto, podemos criar uma função que busca por esse padrão de ID dentro das tags dentro do objeto soup e, em seguida, coleta os dados dentro de cada tag .

ipea1.png

Para definir o intervalo de dados a ser extraído da web, podemos assumir que o campo "Data" de sales_data está em ordem cronológica.

Podemos começar identificando a data da primeira ocorrência. Em seguida, calculamos a diferença no número de dias entre a última ocorrência e a data de hoje. Essa diferença calculada servirá como o intervalo para a extração de dados na web, garantindo que apenas os dados dentro desse período específico sejam coletados.

In [23]:
first_date  = pd.to_datetime(sales_data ['Data'].iloc[0]).date()
today = datetime.today().date()
range_date = (today - first_date).days
print(f' Today is: {today}')
print(f' The first date in the dataset is: {first_date}')
print(f' The range_date is: {range_date}')
 Today is: 2023-12-07
 The first date in the dataset is: 2007-06-01
 The range_date is: 6033

Agora podemos definir uma função que recupera os valores do dólar dentro do período de tempo especificado e retorna um DataFrame com os valores do dólar e as datas em formato datetime.

Para realizar essa pesquisa, a função assume um padrão de ID fixo no HTML e incrementa a parte final do ID, que representa cada linha da tabela, em cada iteração do loop.

In [24]:
# def get_dollar_value():
#     date = []
#     value = []
#     for id in range((range_date)):
#         id = str(id)
#         pattern = 'grd_DXDataRow' + id
#         id = int(id)
        
#         # It searches for the first <tr> element that has an id attribute matching the pattern 
#         tr =  soup.find('tr', {'id' : pattern})
        
#         # retrieves all the <td> (table cell) elements within a specific <tr> (table row) element.
#         t_data_tags = tr.find_all("td")
#         date.append(t_data_tags[0].text)
#         value.append(t_data_tags[1].text)
#         date[id] = datetime.strptime(date[id], '%d/%m/%Y')
#         if (date[id]) == first_date:
#             break
#     data = {'Data': date, 'US_Dollar_in_R$': value}
#     dollar_df = pd.DataFrame(data)
 
#     return dollar_df

Obtendo valores do dólar:

In [25]:
# dollar_df = get_dollar_value()
In [26]:
dollar_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6031 entries, 0 to 6030
Data columns (total 2 columns):
 #   Column           Non-Null Count  Dtype 
---  ------           --------------  ----- 
 0   Data             6031 non-null   object
 1   US_Dollar_in_R$  6031 non-null   object
dtypes: object(2)
memory usage: 94.4+ KB

Converter Data para o formato datetime e verificar valores nulos:

In [27]:
dollar_df['Data'] = pd.to_datetime(dollar_df['Data'])
print(sales_data['Data'].isnull().sum())
0

Converter US_Dollar_in_R$ para o formato float e verificar valores nulos:

In [28]:
dollar_df['US_Dollar_in_R$'] = dollar_df['US_Dollar_in_R$'].apply(lambda x: str(x.split()[0].replace(',', '.')))
dollar_df['US_Dollar_in_R$'] = dollar_df['US_Dollar_in_R$'].astype(float)
print(dollar_df['US_Dollar_in_R$'].isnull().sum())
0

Salvando valores do como csv:

In [29]:
#dollar_df.to_csv('./data/csv_files/dollar.csv', index =False)
In [30]:
dollar_df.head()
Out[30]:
Data US_Dollar_in_R$
0 2023-12-05 4.9516
1 2023-12-04 4.9085
2 2023-12-01 4.9185
3 2023-11-30 4.9349
4 2023-11-29 4.8927
In [31]:
dollar_df.tail()
Out[31]:
Data US_Dollar_in_R$
6026 1999-11-12 1.9323
6027 1999-11-11 1.9280
6028 1999-11-10 1.9340
6029 1999-11-09 1.9233
6030 1999-11-08 1.9258
In [32]:
dollar_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6031 entries, 0 to 6030
Data columns (total 2 columns):
 #   Column           Non-Null Count  Dtype         
---  ------           --------------  -----         
 0   Data             6031 non-null   datetime64[ns]
 1   US_Dollar_in_R$  6031 non-null   float64       
dtypes: datetime64[ns](1), float64(1)
memory usage: 94.4 KB

Mesclando sales_data e dollar_df em um único DataFrame.

In [33]:
sales_data = pd.merge(sales_data, dollar_df)

Checando valores NaN:

In [34]:
sales_data.isna().sum()
Out[34]:
Data               0
NF                 0
Est                0
Pedido             0
Cliente            0
Descrição          0
Esp                0
Larg               0
Comp               0
Preço_pç           0
Preço_kg           0
Quantidade         0
Total              0
Tipo de Produto    0
Comissão           0
Família Produto    0
US_Dollar_in_R$    0
dtype: int64
In [35]:
sales_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 19197 entries, 0 to 19196
Data columns (total 17 columns):
 #   Column           Non-Null Count  Dtype         
---  ------           --------------  -----         
 0   Data             19197 non-null  datetime64[ns]
 1   NF               19197 non-null  object        
 2   Est              19197 non-null  object        
 3   Pedido           19197 non-null  object        
 4   Cliente          19197 non-null  object        
 5   Descrição        19197 non-null  object        
 6   Esp              19197 non-null  object        
 7   Larg             19197 non-null  object        
 8   Comp             19197 non-null  object        
 9   Preço_pç         19197 non-null  float64       
 10  Preço_kg         19197 non-null  float64       
 11  Quantidade       19197 non-null  int64         
 12  Total            19197 non-null  float64       
 13  Tipo de Produto  19197 non-null  object        
 14  Comissão         19197 non-null  object        
 15  Família Produto  19197 non-null  object        
 16  US_Dollar_in_R$  19197 non-null  float64       
dtypes: datetime64[ns](1), float64(4), int64(1), object(11)
memory usage: 2.6+ MB

Houve uma variação no volume de dados em sales_data . Primeiramente, tínhamos 19139 linhas, após mesclar com products ficamos com 19840 linhas em todos os campos, e finalmente após mesclar com dollar_df obtivemos 19197.

Essa variação no número de linhas pode ser atribuída à duplicação de valores após a mesclagem com a tabela de produtos. É essencial abordar esse problema no futuro para garantir a integridade dos dados no banco de dados do nosso sistema.

Podemos usar as colunas Pedido e Quantidade como identificadores de valores duplicados já que mais de uma ocorrência repetida destes dois valores pode representar a presença de entradas duplicadas no conjunto de dados.

In [85]:
duplicates = sales_data.duplicated(subset=['NF','Pedido','Cliente','Quantidade'], keep = False)

# Filter the original DataFrame to show only the duplicate rows
duplicate_rows = sales_data[duplicates]

for index, row in duplicate_rows.iterrows():
    print(f'Original:{row["NF"]} -  {row["Cliente"]} - {row["Pedido"]} - {row["Quantidade"]}, Duplicated:{row["NF"]} - {row["Cliente"]} {row["Pedido"]} - {row["Quantidade"]}')

print(f'The number of duplicates is: {duplicates.sum()}')
#duplicates.head()
The number of duplicates is: 0
In [37]:
duplicate_rows.head()
Out[37]:
Data NF Est Pedido Cliente Descrição Esp Larg Comp Preço_pç Preço_kg Quantidade Total Tipo de Produto Comissão Família Produto US_Dollar_in_R$
129 2007-06-19 0320336 11 4653-10 REVALIND TR REL 1,20 BOB NBR5007 G4RL BbOL 1,2000 59,0000 0,0000 0.0 3.55 2353 8353.15 TIRA REL 2% RELAMINADO 1.9100
130 2007-06-19 0320336 11 4653-10 REVALIND TR REL 1,20 BOB NBR5007 G4RL BbOL 1,2000 59,0000 0,0000 0.0 3.55 2353 8353.15 TIRA REL 2% RELAMINADO 1.9100
265 2008-03-12 0000072 14 22958-10 COPRIMA TIRA FQ 3,00 NBR6658 3,0000 100,0000 1.200,0000 0.0 2.57 548 1408.36 TFQ 2% TIRA CORTADA 1.6788
266 2008-03-12 0000072 14 22958-10 COPRIMA TIRA FQ 3,00 NBR6658 3,0000 100,0000 1.200,0000 0.0 2.57 548 1408.36 TFQ 2% TIRA CORTADA 1.6788
313 2008-01-29 0336385 11 18788-20 REVALIND TR REL 1,20 BOB NBR5007 G4RL BbOL 1,2000 59,0000 0,0000 0.0 3.55 2299 8161.45 TIRA REL 2% RELAMINADO 1.7754
In [38]:
# Drop the duplicates and assign the result back to final_df
sales_data = sales_data.drop_duplicates(subset=['NF','Pedido','Cliente','Quantidade']).reset_index(drop = True)

# Check for duplicates and print the number of duplicates
duplicates = sales_data.loc[sales_data.duplicated(subset=['NF','Pedido','Cliente','Quantidade'])]
print(f'The number of duplicates is: {sales_data.duplicated(subset=["NF","Pedido","Cliente","Quantidade"]).sum()}')

# Display the duplicates (if any)
print(duplicates)
The number of duplicates is: 0
Empty DataFrame
Columns: [Data, NF, Est, Pedido, Cliente, Descrição, Esp, Larg, Comp, Preço_pç, Preço_kg, Quantidade, Total, Tipo de Produto, Comissão, Família Produto, US_Dollar_in_R$]
Index: []

Duplicadas removidas!

Agora, criaremos colunas separadas para dia, mês e ano a partir da coluna 'Data' que serão usadas para agrupar dados.

Será criada a coluna 'Preço_KG_USD' que indicará o preço por quilo em Dólares.

Essas operações realizadas no DataFrame terão as seguintes implicações:

  • A criação das colunas 'Dia', 'Mês' e 'Ano' permite uma melhor organização e análise dos dados com base nesses componentes temporais. Isso possibilita agrupar e extrair insights em um nível granular, como tendências de vendas por dia, mês ou ano.

  • A criação da coluna 'Price_KG_USD' oferece uma perspectiva adicional sobre preços, convertendo o preço por quilo de Real Brasileiro para Dólares Americanos (USD/Kg). Essa conversão facilita comparações com mercados internacionais e permite a análise de diferenciais de preço e competitividade.

  • Finalmente, a reorganização das colunas no DataFrame ajuda a melhorar a legibilidade e garante que as colunas estejam organizadas de acordo com a ordem desejada especificada no código. Isso pode ser útil para uma interpretação mais fácil dos dados e análises subsequentes.

In [39]:
# Create a day column and Get the day from Date
sales_data['Dia'] = sales_data['Data'].dt.day.astype(int)

# Create a Month column and Get the month from Date
sales_data['Mês'] = (sales_data['Data'].dt.month).astype(int)

# Create a Year column and get the year from Date
sales_data['Ano'] = sales_data['Data'].dt.year.astype(int)

# Create a Column for USD/kg price by converting the R$/Kg Price as USD/Kg Price 
sales_data['Preço_KG_USD'] = sales_data['Preço_kg'] / sales_data['US_Dollar_in_R$']

# Reorder the columns
sales_data= pd.DataFrame(sales_data, columns=["Data",'Dia','Mês','Ano','NF','Cliente','Pedido',"Descrição",
                               'Esp','Larg','Comp','Tipo de Produto','Família Produto',
                               'Quantidade','Preço_pç','Preço_kg','US_Dollar_in_R$','Preço_KG_USD','Total','Comissão'
                              ])

sales_data.loc[0:1]
Out[39]:
Data Dia Mês Ano NF Cliente Pedido Descrição Esp Larg Comp Tipo de Produto Família Produto Quantidade Preço_pç Preço_kg US_Dollar_in_R$ Preço_KG_USD Total Comissão
0 2007-06-01 1 6 2007 0319203 JRIND. 1223-30 CHAPA GR LTQ DEC 6,30 NBR8300 OL 6,3000 1.200,0000 3.000,0000 CHAPA GR LTQ DECOL CHAPA 1456 0.0 2.53 1.9048 1.328223 3683.68 1%
1 2007-06-01 1 6 2007 0319202 JRIND. 3350-20 CHAPA FQ DEC 4,25 NBR6658 OL 4,2500 1.200,0000 3.000,0000 CFQ DEC OL CHAPA 3081 0.0 2.35 1.9048 1.233725 7240.35 1%

A ideia agora é extrair determinados valores em variáveis para que possam ser usados para calcular métricas e visualizar a distribuição dos valores posteriormente.

Em resumo, pretendemos fazer o seguinte:

  1. Extrair os valores únicos da coluna 'Dia' e armazená-los na variável 'dias'. Esta lista representará a ordem cronológica dos dias e pode ser usada para analisar o montante de vendas em cada dia.

  2. Extrair os valores únicos da coluna 'Mês' e armazená-los na variável 'meses'. Esta lista representará a ordem cronológica dos meses e pode ser usada para analisar o montante de vendas mensalmente.

  3. Extrair os valores únicos da coluna 'Ano' e armazená-los na variável 'anos'. Esta lista representará a ordem cronológica dos anos e pode ser usada para analisar o montante de vendas anualmente.

  4. Recuperar os valores das colunas 'Quantidade', 'Esp', 'Larg' e 'Preços'. Essas listas de quantidades, espessuras, larguras e preços podem ser usadas para análises ou cálculos adicionais.

Essas operações permitem a extração de valores únicos de colunas específicas, possibilitando análises com base em dias, meses e anos. Além disso, os valores de outras colunas podem ser usados para diversos fins, como calcular estatísticas ou realizar análises adicionais no conjunto de dados.

In [40]:
# To obtain a list of days in chronological order, we can extract the unique values from the 'Day' column. 
dias = (sales_data['Dia'].unique()).astype(int)
dias.sort()
dias
Out[40]:
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
       18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31])
In [41]:
# To obtain a list of months in chronological order, we can extract the unique values from the 'Month' column. 
meses = (sales_data['Mês'].unique()).astype(int)
meses.sort()
meses
Out[41]:
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
In [42]:
# To obtain a list of years in chronological order, we can extract the unique values from the 'Year' column. 
anos = (sales_data['Ano'].unique()).astype(int)
anos.sort()
anos
Out[42]:
array([2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
       2018, 2019, 2020, 2021, 2022, 2023])
In [43]:
quantidades = (sales_data['Quantidade'])
In [44]:
espessuras = (sales_data['Esp'].unique())
espessuras.sort()
espessuras
Out[44]:
array(['0,2500', '0,2700', '0,3000', '0,3300', '0,3500', '0,4000',
       '0,4300', '0,4500', '0,4700', '0,4900', '0,5000', '0,5500',
       '0,6000', '0,6500', '0,7000', '0,7500', '0,8000', '0,8100',
       '0,9000', '0,9500', '1,0000', '1,0600', '1,1100', '1,2000',
       '1,2100', '1,2400', '1,2500', '1,5000', '1,5500', '1,6000',
       '1,8000', '1,9000', '1,9500', '10,0000', '11,2000', '12,5000',
       '14,0000', '150,0000', '16,0000', '19,0000', '2,0000', '2,2500',
       '2,3000', '2,5000', '2,6500', '2,7000', '2,9900', '22,4000',
       '25,0000', '3,0000', '3,3500', '3,5000', '3,7500', '31,5000',
       '37,5000', '4,0000', '4,2500', '4,7400', '4,7500', '44,5000',
       '50,0000', '6,3000', '6,3500', '63,0000', '75,0000', '8,0000',
       '89,0000', '9,0000', '9,5000'], dtype=object)
In [45]:
larguras = (sales_data['Larg'].unique())
larguras.sort()
larguras
Out[45]:
array(['0,0000', '1.000,0000', '1.045,0000', '1.060,0000', '1.080,0000',
       '1.100,0000', '1.120,0000', '1.132,0000', '1.140,0000',
       '1.150,0000', '1.200,0000', '1.220,0000', '1.245,0000',
       '1.250,0000', '1.300,0000', '1.400,0000', '1.500,0000',
       '1.800,0000', '100,0000', '101,0000', '101,5000', '102,0000',
       '103,0000', '104,0000', '105,0000', '106,0000', '107,0000',
       '11,0000', '110,0000', '111,0000', '111,5000', '112,0000',
       '113,0000', '115,0000', '116,0000', '118,0000', '119,0000',
       '12,0000', '12,5000', '120,0000', '121,0000', '122,0000',
       '122,8000', '124,0000', '125,0000', '127,0000', '128,0000',
       '130,0000', '132,0000', '138,0000', '139,0000', '14,0000',
       '140,0000', '140,5000', '142,0000', '145,0000', '145,8000',
       '147,0000', '148,0000', '149,5000', '15,0000', '150,0000',
       '155,0000', '157,0000', '16,0000', '160,0000', '161,0000',
       '162,0000', '165,0000', '166,0000', '17,0000', '170,0000',
       '175,0000', '18,0000', '182,0000', '184,0000', '185,0000',
       '19,0000', '19,2000', '19,8000', '190,0000', '191,0000',
       '192,0000', '194,0000', '195,5000', '198,0000', '2.000,0000',
       '2.440,0000', '20,0000', '20,8000', '200,0000', '202,0000',
       '203,0000', '204,0000', '207,0000', '21,0000', '21,7000',
       '210,0000', '213,0000', '217,0000', '219,0000', '22,0000',
       '222,0000', '223,0000', '224,0000', '225,0000', '228,0000',
       '23,0000', '23,2000', '23,5000', '238,0000', '239,0000', '24,0000',
       '24,2000', '24,5000', '24,7000', '240,0000', '243,0000',
       '248,0000', '25,0000', '25,4000', '25,8000', '250,0000',
       '252,0000', '26,0000', '26,5000', '260,0000', '265,0000',
       '268,0000', '27,0000', '270,0000', '274,0000', '275,0000',
       '277,0000', '28,0000', '280,0000', '285,0000', '285,2000',
       '287,0000', '29,0000', '29,5000', '290,0000', '298,0000',
       '30,0000', '30,5000', '300,0000', '308,0000', '31,0000', '31,2000',
       '311,0000', '315,0000', '32,0000', '32,8000', '33,0000',
       '331,0000', '334,0000', '335,0000', '34,0000', '346,0000',
       '349,0000', '35,0000', '35,5000', '350,0000', '354,0000',
       '36,0000', '36,5000', '37,0000', '375,0000', '378,0000', '38,0000',
       '38,5000', '39,0000', '399,0000', '40,0000', '40,8000', '400,0000',
       '41,0000', '41,1000', '41,5000', '411,0000', '42,0000', '42,5000',
       '424,0000', '43,0000', '43,5000', '439,0000', '44,0000', '44,3000',
       '45,0000', '46,0000', '46,5000', '47,0000', '48,0000', '48,8000',
       '480,0000', '49,0000', '49,3000', '49,5000', '49,6000', '490,0000',
       '50,0000', '50,2000', '50,5000', '50,8000', '51,0000', '51,5000',
       '52,0000', '52,5000', '53,0000', '53,2000', '54,0000', '54,5000',
       '55,0000', '55,5000', '55,7000', '56,0000', '56,5000', '56,6000',
       '56,7000', '57,0000', '57,5000', '57,8000', '570,0000', '58,0000',
       '58,5000', '58,8000', '584,0000', '59,0000', '59,5000', '59,8000',
       '60,0000', '61,0000', '62,0000', '63,0000', '63,5000', '630,0000',
       '64,0000', '65,0000', '65,4000', '654,0000', '66,0000', '67,0000',
       '67,5000', '67,8000', '68,0000', '69,0000', '70,0000', '70,5000',
       '71,0000', '72,0000', '72,5000', '73,0000', '73,5000', '74,0000',
       '74,5000', '75,0000', '76,0000', '77,0000', '78,0000', '78,8000',
       '79,0000', '80,0000', '80,5000', '81,0000', '82,0000', '83,0000',
       '84,0000', '85,0000', '850,0000', '87,0000', '88,0000', '89,0000',
       '90,0000', '900,0000', '91,0000', '910,0000', '92,0000',
       '920,0000', '93,0000', '94,0000', '94,8000', '945,0000', '95,0000',
       '95,4000', '96,0000', '97,0000'], dtype=object)

Agora temos um DataFrame bem formatado com dados suficientes do período especificado que podem ser mesclados com outros conjuntos de dados.

6 Questionando e analisando os dados.¶

Qual é a estatistica Descritiva dos principais dados numéricos?

In [46]:
stats = sales_data.describe()[['Preço_kg','Preço_KG_USD', 'US_Dollar_in_R$','Quantidade', 'Total']]
stats
Out[46]:
Preço_kg Preço_KG_USD US_Dollar_in_R$ Quantidade Total
count 18464.000000 18464.000000 18464.000000 18464.000000 18464.00000
mean 4.278443 1.513351 2.852116 2514.499458 10409.35993
std 2.492917 0.482775 1.173674 2558.492755 13007.79520
min 1.900000 0.550728 1.533700 19.000000 54.15000
25% 2.750000 1.159350 1.839000 1051.000000 3720.39750
50% 3.410000 1.430998 2.321800 1672.000000 6516.70500
75% 4.670000 1.776863 3.720200 3002.000000 11967.15000
max 17.880000 4.553903 5.936600 34733.000000 253272.00000
In [115]:
price_view = sales_data['Preço_kg'].plot(kind = 'kde', title= 'Preço/Kg-Concentração de Ocorrência')
price_view.set_xlabel('Preço_kg')
Out[115]:
Text(0.5, 0, 'Preço_kg')
In [86]:
# Pricing Visualization (box plots)
plt.figure(figsize=(12, 6))
sns.boxplot(x='Preço_kg', data=sales_data)
plt.title('Distribuição do Preço/KG')
plt.show()
In [48]:
price_view = sales_data['Preço_kg'].plot(kind = 'hist', bins = 80, title= 'Distribuição do Preço/Kg-R$')
price_view.set_xlabel('Preço_kg')
price_view.set_ylabel('Contagem')
Out[48]:
Text(0, 0.5, 'Contagem')
In [118]:
dollar_view = sales_data['US_Dollar_in_R$'].plot(kind = 'kde', title= 'Dolar-Concentração de Ocorrência')
In [116]:
dollar_view = sales_data['US_Dollar_in_R$'].plot(kind = 'hist', bins = 80, title= 'Concentração do Valor do Dolar')

dollar_view.set_xlabel('US_Dollar_in_R$')
dollar_view.set_ylabel('Contagem')
Out[116]:
Text(0, 0.5, 'Contagem')

Qual é correlação entre o preço dos materiais e a variação do preço do dólar?

In [51]:
plt.figure(figsize=(10, 4))
sns.scatterplot(data=sales_data, x='Preço_kg', y='US_Dollar_in_R$', hue='Preço_kg')
plt.xlabel('Preço_kg')
plt.ylabel('US_Dollar_in_R$')
plt.title('Correlation between Preço_kg and US_Dollar')
plt.show()

Qual é a correlação entre as demais variáveis?

In [70]:
correlation_matrix = sales_data.corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Heatmap')
plt.show()
/tmp/ipykernel_3552891/3965154667.py:2: FutureWarning: The default value of numeric_only in DataFrame.corr is deprecated. In a future version, it will default to False. Select only valid columns or specify the value of numeric_only to silence this warning.
  correlation_matrix = sales_data.corr()
In [76]:
numeric_columns = sales_data.select_dtypes(include=['float64', 'int64'])
sns.pairplot(numeric_columns)
plt.suptitle('Pairplot of Numeric Columns')
plt.show()

Como é variação de preço por Tipo de Produto?

In [61]:
plt.figure(figsize=(14, 6))
sns.boxplot(x='Tipo de Produto', y='Preço_kg', data=sales_data)
plt.title('Distribuição de Preço por Tipo de Produto')
plt.xticks(rotation=90)
plt.show()

Qual é menor e maior preço por família de Produto?

In [60]:
min_max_data = product_group['Preço_kg'].agg([min, max])
# Reset the index to make the columns as regular columns
min_max_data = min_max_data.reset_index()
min_max_data
Out[60]:
Família Produto min max
0 BLANK 2.52 13.50
1 BOBINA 2.03 13.65
2 CHAPA 1.90 14.82
3 CORTE TÉRMICO 2.52 7.14
4 FITA 2.09 17.88
5 PERFIL 2.11 4.96
6 RELAMINADO 2.90 16.98
7 TELHA 3.07 7.91
8 TIRA CORTADA 2.46 3.45
9 TUBO 2.45 2.45
In [62]:
plt.figure(figsize=(10, 6))
plt.plot(min_max_data['Família Produto'], min_max_data['min'], label='Minimum Price', color='blue' )
plt.plot(min_max_data['Família Produto'], min_max_data['max'], label='Maximum Price', color='green')
plt.xlabel('Família Produto')
plt.ylabel('Preço_kg')
plt.title('Mínimo e Máximo preço por Produto')
plt.xticks(rotation=45)
plt.legend()
plt.show()
In [87]:
# Time Series Analysis:
sales_data.set_index('Data')['Total'].plot(title='Vendas em R$ sobre Tempo', figsize=(12, 6))
plt.xlabel('Date')
plt.ylabel('Total Sales')
plt.show()
In [109]:
# Time Series Analysis:
sales_data.set_index('Data')['Quantidade'].plot(title=' Vendas em Kg sobre Tempo', figsize=(12, 6))
plt.xlabel('Date')
plt.ylabel('Quantity')
plt.show()
In [125]:
# Group by year and calculate the total quantity and the total quantity in the previous year
quantity_variation = sales_data.groupby('Ano')['Quantidade'].sum()
quantity_variation_previous = quantity_variation.shift(1)

# Calculate the percentage variation
percentage_variation = ((quantity_variation - quantity_variation_previous) / quantity_variation_previous) * 100

# Plot the percentage variation
plt.figure(figsize=(10, 6))
percentage_variation.plot(kind='bar', color='lightgreen')
plt.title('Variação Percentual da Quantidade em % sobre Tempo')
plt.xlabel('Year')
plt.ylabel('Percentage Variation (%)')
plt.show()
In [126]:
# Group by year and calculate the total quantity and the total quantity in the previous year
quantity_variation = sales_data.groupby('Ano')['Total'].sum()
quantity_variation_previous = quantity_variation.shift(1)

# Calculate the percentage variation
percentage_variation = ((quantity_variation - quantity_variation_previous) / quantity_variation_previous) * 100

# Plot the percentage variation
plt.figure(figsize=(10, 6))
percentage_variation.plot(kind='bar', color='lightgreen')
plt.title('Variação Percentual do Valor sobre Tempo')
plt.xlabel('Year')
plt.ylabel('Percentage Variation (%)')
plt.show()
In [124]:
plt.figure(figsize=(12, 6))
quantity_variation.plot(marker='o', linestyle='-')
plt.title('Variação Percentual do Valor sobre Tempo')
plt.xlabel('Ano')
plt.ylabel('Total em R$')
plt.grid(True)
plt.show()

Qual é o volume em peso de materiais vendidos durante o perído?

In [52]:
values = ['Quantidade']
sales_years = sales_data.groupby('Ano')[values].sum().reset_index()
sales_years = sales_years.sort_values(['Quantidade'], ascending=True)
plt.figure(figsize=(10, 6))
plt.bar(sales_years['Ano'], sales_years['Quantidade'])
plt.xlabel('Ano')
plt.ylabel('Soma')
plt.title('Quantidade por Ano')
plt.show()
sales_years
Out[52]:
Ano Quantidade
0 2007 1578837
16 2023 1604876
15 2022 1657733
14 2021 1791880
2 2009 1824527
13 2020 2220576
1 2008 2241356
9 2016 2284979
10 2017 2312175
12 2019 2812871
11 2018 3035568
8 2015 3367661
7 2014 3463187
4 2011 3527233
3 2010 3710843
5 2012 4076627
6 2013 4916789

Qual é o volume financeiro de materiais vendidos durante o perído?

In [53]:
values = ['Total']
sales_years = sales_data.groupby('Ano')[values].sum().reset_index()
#sales_years = sales_years.sort_values(['Quantidade'], ascending=False)
plt.figure(figsize=(10, 6))
plt.bar(sales_years['Ano'], sales_years['Total'])
plt.xlabel('Ano')
plt.ylabel('Soma')
plt.title('Volume em R$ por Ano')
plt.show()
sales_years
Out[53]:
Ano Total
0 2007 4053582.65
1 2008 7419169.34
2 2009 5812028.05
3 2010 10855256.97
4 2011 8923399.56
5 2012 10064377.31
6 2013 14058140.99
7 2014 11169488.72
8 2015 10573777.50
9 2016 8385675.50
10 2017 10108472.07
11 2018 14025342.29
12 2019 12982344.28
13 2020 11862167.15
14 2021 20553791.46
15 2022 17208099.86
16 2023 14143308.05

Qual é o melhor mês de vendas?

In [106]:
monthly_sales = sales_data.groupby('Mês')['Quantidade'].sum()
plt.figure(figsize=(10, 6))
monthly_sales.plot(kind='bar', title='Comportamento Histórico Mensal/KG')
plt.xlabel('Mês')
plt.ylabel('Quantidade')
plt.show()

Qual é o dia com maior volume de faturamento?

In [55]:
sales_day = sales_data.groupby('Dia')[['Quantidade']].sum().reset_index()
sales_day = sales_day.sort_values(['Quantidade'], ascending=True)
# plot the sales by day
plt.figure(figsize=(10, 6))
plt.bar(sales_day['Dia'], sales_day['Quantidade'])
plt.xticks(sales_day['Dia'])
plt.ylabel('Quantidade')
plt.title('Distribuição do Faturamento por Dia')
plt.xlabel('Dia')
plt.show()
sales_day
Out[55]:
Dia Quantidade
1 2 1167771
0 1 1191950
30 31 1282070
2 3 1295637
11 12 1302599
6 7 1320144
5 6 1365809
20 21 1382547
14 15 1386508
16 17 1392646
8 9 1396384
3 4 1425455
19 20 1433862
4 5 1445234
10 11 1475815
24 25 1482382
23 24 1509186
25 26 1519991
22 23 1538110
18 19 1545037
7 8 1549045
15 16 1567381
21 22 1577190
12 13 1579384
13 14 1627537
27 28 1689862
28 29 1701274
26 27 1723067
29 30 1755781
9 10 1841193
17 18 1956867

Como é o volume acumulado de Familia de Produto?

In [127]:
# Group and sum the data
grouped_data = sales_data.groupby(['Ano', 'Família Produto'])[['Quantidade']].sum().reset_index()
grouped_data = grouped_data.sort_values(['Quantidade'], ascending=False)
# Create a pivot table for better visualization
pivot_data = grouped_data.pivot(index='Ano', columns='Família Produto', values='Quantidade')
# Plot the pivot table
plt.figure(figsize=(10, 6))
pivot_data.plot(kind='bar', stacked=True, figsize=(10, 6))
plt.xlabel('Ano')
plt.ylabel('Sum of Quantity_KG')
plt.title('Quantidade por Ano  e por Familia de Produto')
plt.legend()
plt.show()
#grouped_data
<Figure size 1000x600 with 0 Axes>

Qual é o produto campeão de vendas?

In [57]:
product_group = sales_data.groupby(['Família Produto'])
product_group_val = product_group['Quantidade'].sum().reset_index()
product_group_val = product_group_val.sort_values(['Quantidade'], ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x='Família Produto', y='Quantidade', data=product_group_val)
plt.xlabel('Família Produto')
plt.ylabel('Quantidade em KG')
plt.title('Vendas por Familia de Produto')
plt.xticks(rotation=75)
plt.show()

Quais são os diferentes tipos de fitas vendidas?

In [58]:
filtered_product = sales_data[sales_data['Família Produto'] == 'FITA']
filtered_product_val = filtered_product.groupby('Tipo de Produto')['Quantidade'].sum().reset_index()
filtered_product_val = filtered_product_val.sort_values(['Quantidade'], ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x='Tipo de Produto', y='Quantidade', data=filtered_product_val)
plt.xlabel('Tipo de Produto')
plt.ylabel('Quantidade (KG)')
plt.title('Quantidade Vendida por tipo de FITA')
plt.xticks(rotation=45)
plt.show()

Qual é a frequência por tipo de Produto?

In [59]:
product_count = sales_data[['Tipo de Produto']].value_counts().to_frame()
product_count = product_count.rename(columns={0: 'Frequency'})
product_count.reset_index()
plt.figure(figsize=(10, 6))
sns.barplot(x=product_count.index.get_level_values(0), y='Frequency', data=product_count)
plt.xlabel('Tipo de Produto')
plt.ylabel('Frequency')
plt.title('Frequencia por Tipo de Produto')
plt.xticks(rotation=90)
plt.show()

Qual é o valor total concentrado por Tipo de produto?

In [90]:
# Financial Analysis:

plt.figure(figsize=(12, 6))
sales_data.groupby('Tipo de Produto')['Total'].sum().sort_values(ascending=False).plot(kind='bar')
plt.title('Vendas em R$ Concentradas por Tipo de Produto')
plt.xlabel('Product Type')
plt.ylabel('Total Sales')
plt.show()

Qual é a quantidade vendida por Família de produto?

In [63]:
# Group by 'Cliente' and sum the 'Quantidade'
quantidade_per_material = sales_data.groupby('Família Produto')['Quantidade'].sum().sort_values().reset_index()

# Print the DataFrame
quantidade_per_material
Out[63]:
Família Produto Quantidade
0 TUBO 235
1 TELHA 23027
2 TIRA CORTADA 37253
3 PERFIL 78356
4 CORTE TÉRMICO 120962
5 BOBINA 1600308
6 BLANK 1731815
7 RELAMINADO 2878207
8 FITA 14317862
9 CHAPA 25639693
In [98]:
product_family_distribution = sales_data['Família Produto'].value_counts()
product_family_distribution.plot.pie(autopct='%1.1f%%', startangle=90, title='Product Family Distribution')
plt.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.
plt.show()

Qual é a quantidade vendida por Tipo de produto?

In [64]:
# Group by 'Cliente' and sum the 'Quantidade'
quantidade_per_material = sales_data.groupby('Tipo de Produto')['Quantidade'].sum().sort_values().reset_index()

# Print the DataFrame
quantidade_per_material
Out[64]:
Tipo de Produto Quantidade
0 TUBO QUAD 235
1 CUMEEIRA 365
2 CGAL 1121
3 TFF OL 2041
4 PERFIL FF 3530
5 TFQ 13486
6 PERFIL GR LTQ 13669
7 FAE 20340
8 TIRA GR LTQ 21726
9 TELHA 22662
10 LASER 33488
11 CFQ PISO 41421
12 PERFIL FQ 61157
13 BOBINA FQ DECOL 63635
14 BOBINA FF 64526
15 OXICORTE 87474
16 TIRA GALV BOB 122915
17 CHAPA GR LTQ DECOL 128081
18 TFQ BOB 152737
19 BOBINA GR LTQ 175305
20 BKGRLTQ 226630
21 BOBINA FQ 379345
22 BOBINA GALVALUME 395627
23 BOBINA ZC 521870
24 CG DO LCG 720081
25 CZC 1494615
26 TFQ DEC BOB 1501004
27 BKFF 1505185
28 CFQ DEC OL 2516611
29 CFF OL 2876534
30 TIRA REL 2878207
31 TZC BOB 5475501
32 CFQ 5733243
33 TFF OL BOB 7045365
34 CG DO LTQ 12127986

Como é o volume de vendas por espessura?

In [110]:
quant_by_thick = sales_data.groupby('Esp')[['Quantidade']].sum().reset_index()
quant_by_thick = quant_by_thick.sort_values(['Quantidade'], ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x='Esp', y='Quantidade', data=quant_by_thick)
plt.xlabel('Espessura')
plt.ylabel('Sum of Quantity_KG')
plt.title('Volume de Vendas por Espessura')
plt.xticks(rotation=90)  # Rotate x-axis labels by 45 degrees
plt.show()
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
    print(quant_by_thick)
         Esp  Quantidade
68    9,5000     3720536
65    8,0000     3141363
61    6,3000     3017636
26    1,2500     2892476
49    3,0000     2517213
27    1,5000     2515880
12    0,6000     2376591
23    1,2000     2166400
56    4,2500     2152377
18    0,9000     1958857
44    2,6500     1915645
40    2,0000     1806811
35   12,5000     1790910
2     0,3000     1714835
32    1,9500     1429020
58    4,7500     1290580
4     0,3500     1172793
28    1,5500      981752
67    9,0000      939966
15    0,7500      783274
31    1,9000      756788
19    0,9500      546261
10    0,5000      463221
21    1,0600      430854
22    1,1100      381064
41    2,2500      325500
6     0,4300      280829
16    0,8000      277774
45    2,7000      256753
52    3,7500      253014
5     0,4000      222438
42    2,3000      212473
38   16,0000      203670
53   31,5000      197939
7     0,4500      177924
50    3,3500      114389
48   25,0000      111703
57    4,7400      107657
55    4,0000      107122
39   19,0000       98364
54   37,5000       75433
13    0,6500       72725
47   22,4000       58387
46    2,9900       57192
33   10,0000       56641
30    1,8000       45820
60   50,0000       37699
43    2,5000       31377
34   11,2000       25668
0     0,2500       18440
36   14,0000       18106
51    3,5000       12880
20    1,0000       12008
63   63,0000       11400
37  150,0000       10613
25    1,2400       10336
66   89,0000        9316
59   44,5000        8957
11    0,5500        8893
14    0,7000        8669
62    6,3500        8286
24    1,2100        6675
8     0,4700        4400
9     0,4900        2456
29    1,6000        1469
64   75,0000        1263
1     0,2700         995
17    0,8100         688
3     0,3300         274
In [89]:
sales_data['Quantidade'].plot(kind='hist', bins=70, title='Ticket Médio em Kg')
plt.xlabel('Quantity')
plt.ylabel('Frequency')
plt.show()
In [103]:
plt.figure(figsize=(10, 6))
clients_per_year = sales_data.groupby(['Ano'])['Cliente'].nunique()
clients_per_year.plot(kind='bar', color='green')
plt.title('Numero de Clientes por Ano')
plt.xlabel('Ano')
plt.ylabel('Numero de Clientes')
for i, value in enumerate(clients_per_year):
    plt.text(i, value + 0.1, str(value), ha='center', va='bottom')
plt.show()

Qual é o volume de compras por cliente?

In [119]:
# Group by 'Cliente' and sum the 'Quantidade'
quantidade_per_cliente = sales_data.groupby('Cliente')['Quantidade'].sum().sort_values().reset_index()

# Print the DataFrame
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
    print(quantidade_per_cliente)
          Cliente  Quantidade
0     LINADALMORO         521
1      RECHEPADIL         550
2          DEMORE         560
3         CORTACO         623
4        GLOBOMIX         695
5           ATENA         711
6       HOFFMANN1         717
7         GANADAL         731
8            MAVE         842
9        OXICORTE         865
10      SCHIOLTDA         942
11      MILANOMOV        1047
12       CORDATEX        1065
13         SOFISA        1085
14     SCARIOTMET        1218
15       SANMARCO        1343
16    MACEDOBIOND        1389
17    GILMARPEGOR        1469
18      CONTRUBEL        1490
19        MDOLTDA        1518
20     IRMAOSMOTA        1569
21        JARFLEX        1583
22     TECNOMETAL        1608
23    IECODESENVO        1665
24          RAINE        1668
25       BEMFATTO        1729
26    LEAFARLOGIS        1827
27        KALIENT        1833
28          ENVEL        1843
29       REGIACOM        1988
30           FAMM        2045
31    MAGNUMETALU        2064
32         ATHENA        2091
33       CJINDUST        2174
34      METALBRIL        2203
35     MILENIUMTR        2250
36     DANFERLTDA        2288
37    AGOSTINETTO        2289
38    IRMAOSLUVIS        2347
39       MALTAIND        2358
40     CRICELMONT        2458
41     JKFERREIRA        2756
42        FAMCORP        2795
43   ARQUITETARIA        2855
44          TREGA        2856
45       SUPRAMEC        2859
46        SPOTSUL        2902
47       MULTIFER        2916
48            ASP        2968
49          GEDOZ        2982
50    TEDESCOLTDA        3041
51      BRINDILUZ        3116
52     ASSISTEMAQ        3337
53            IPE        3403
54    NONOFERRERO        3405
55     ANHANGUERA        3417
56            JAY        3694
57      SULTORRES        3706
58          LTMET        3826
59      CASTERSUL        3867
60          COBRA        3889
61    UNITECINDUS        4015
62     ARCOIRISIN        4034
63    DUPARCEMPRE        4101
64       THEPLACE        4359
65     ARMARINHOS        4424
66      DOSULINDE        4577
67     FURGOKIT'S        4602
68            PAG        4718
69        MULTIAR        4732
70           GPER        4754
71    DARDOCOMERC        4893
72     EXPRESSOVR        4952
73    MICHELEHAAB        4974
74     DIMILANOPO        5061
75    PROTECARTER        5062
76      D.M.VIANA        5089
77        ARSILVA        5408
78        MORKATA        5750
79      MENEGOTTO        5809
80      DITALINDE        5836
81        EDREAZA        5870
82            TRG        6035
83            MDO        6165
84            SEG        6249
85     METALCUBAS        6311
86    RAVINOXMETA        6359
87    VILLAFRANCA        6575
88          FIXAR        6599
89    NOVOPAPAGAI        6870
90         ZANBOR        6965
91          GAUER        7275
92    METCECHINAT        7295
93       REBITSUL        7339
94            IPR        7450
95    TRONCONTROL        7516
96             RD        7541
97    UMBERTOBERT        7603
98    PLASTICENTE        7862
99          FRAMA        7941
100        FORBAL        8002
101    SAOMARCOSL        8003
102       PROMATE        8126
103     SUNWAVEIN        8129
104   MECANICACAR        8660
105   G3INDUSTRIA        8743
106     UTIL-LINE        8844
107   UNYPERINDUS        9157
108         TRACO        9316
109           AHJ        9396
110    QUADRITECH       10081
111        SILDRE       10486
112       TATACOM       10532
113     RDINDECOM       10707
114   RESIDAINCOR       10826
115    METMDBLTDA       10989
116      CTRESIND       11048
117     60MOSMANN       11593
118        SUERJE       11628
119     TECNIARTE       11718
120     METALNOVA       11729
121   G3PLASTICOS       12017
122   CARLOSGOMES       12036
123   GENERALCOAT       12201
124      AMMINDDE       12205
125       POMMIER       12367
126          CCGL       12404
127    AGGYINDUST       12506
128   ANTONIOTEGN       12731
129     INELFAIND       12802
130         ACO3D       12837
131   METSALVADOR       13001
132        DOMPEL       13021
133    COMPACTIND       13067
134         TUTTO       13669
135          DALE       13930
136   GEETECEQUIP       13996
137          LOHR       14227
138         REVAL       14731
139       JOPEMAR       15038
140      FAMERTEC       15064
141   L.MARQUEZZO       15168
142   EXATAENGENH       15777
143      RBETIOLO       16182
144            RS       16325
145       IMZOLET       16432
146   MULTTECNICA       16619
147     FXOEIRELI       16862
148           KDM       16924
149     MRACARTOE       16947
150   AGROP.SCHIO       17090
151    TESSAROIND       17166
152       BENFATI       17252
153           IBP       17287
154         CIKLO       17344
155           RLG       17509
156       PHTRANS       18230
157      ACOGRATO       18528
158   ACESITASERV       19790
159    CHIAPERINI       19826
160       SCHIFER       19938
161   AGROPECSCHI       20100
162   GAUERAUTOPE       20315
163        BRANDA       21045
164        JARDIM       21170
165   SCHMITTUTIL       21225
166      GIGIOIND       21755
167         RALKY       22675
168    TECHMASTER       22878
169    FONTANAMAQ       24262
170     METALFORM       24616
171       DALMORO       25765
172      FERNANDA       25929
173           LCA       26193
174   BSBCONSTRUC       26746
175         FORMA       27429
176        GSDIND       28237
177           KAE       28408
178       BKCONST       28972
179      ANODILAR       29667
180    JMARCONIND       29689
181        ROLEJU       31162
182   BLPMAQUINAS       31795
183    GIACOMELLI       32972
184   MULTISERVSE       33977
185       MINERVA       34100
186      METALBEL       36439
187      RSCAXIAS       37655
188     MS-ENGENH       38798
189  QUADRILATERO       39038
190  IMPLYTECNOLO       44024
191       INCOMAQ       44233
192   IVANCARNINO       44397
193      CADERODE       44680
194        CAMERA       45019
195           CIM       46550
196         RZMAQ       47719
197   RODOV.SCHIO       51257
198     ALCASTS/A       52519
199   ESCOVASCRUZ       53869
200   ENIOSCARIOT       55796
201        MARTAN       57257
202    HYVADOBRAS       58176
203      PLASLINK       63763
204       CANELLO       63883
205        VIEMME       64220
206        NAUTEC       64545
207   STEFFENSIND       64677
208    RUGERIMECR       66433
209        FABBOF       66585
210           NZN       67151
211       JRIND.2       69783
212   PRONATTOEQU       70105
213         IBRAL       73212
214      ORQUIDEA       73588
215   BASECOMPONE       76868
216       RODAROS       77471
217           PMP       80406
218       GUARANY       82564
219   METALLIACOS       86232
220    OMPDOBRASI       87700
221     ACOBRASIL       89545
222      REVALIND       90227
223    NOVAGERACA       92244
224       METALEX       93857
225         PARTS       94189
226   ANDREMODENA       98982
227       COPRIMA      103211
228      AGROBENE      104117
229   ASPIRAZIONE      106336
230     MRPLASTDO      107319
231           RGB      112382
232    M7COMERCIO      114875
233   GASTROLIDER      116083
234       CRESPAR      128392
235         DAVAL      129743
236   KIFIXINDUST      131238
237    BORTOLOTTO      134047
238     MOVIMENTO      135558
239      ATIVICON      138517
240          LUZI      148981
241     KEKOACESS      149909
242    METALSTAMP      151664
243     BORGHETTI      162986
244      ANGONESE      166473
245        CEMTRA      172002
246    GASTROLIDE      172473
247          ROAL      174831
248   METAISWIZET      178403
249       MAACESS      179248
250     METSISTEM      182732
251        ALCAST      186163
252      RODAROS1      193587
253            GS      199498
254     SASPLASTI      206856
255         GIJON      210982
256        BRIMEL      215875
257         LAIND      236313
258       SCARELI      243289
259   SUPERACOIND      245098
260        UTIMIL      257552
261   RODAROSIND2      263684
262      INCORPOL      275226
263     JOSECELSO      281697
264      METCOSBI      283898
265          LUNA      296891
266        JRIND.      306410
267         CIRNA      352938
268     GPANIZIND      368774
269      D"ZAINER      412984
270     TECNOFRIO      421582
271    METCRESPAR      449976
272      UNIFERRO      455714
273      ACOPLANO      654242
274    PERFILLINE      686926
275    RODAROSIND      750359
276      ENGATCAR     1130543
277        LUPEME     1335554
278        RODARE     1360838
279       MAQENGE     1414076
280        VECTOR     1489952
281      HIDROJET     1931026
282        GPANIZ     2327136
283   METALMATRIX     2606002
284       MOFERKO     2732986
285   METMETALCIN     2943355
286          KEKO     4605456
287      FLANTECH     6202442

Quais clientes não compram acima de 90 dias?

In [121]:
# Identify the last purchase date for each client
last_purchase_date = sales_data.groupby('Cliente')['Data'].max()

# Identify clients who haven't made a purchase in over 120 days
inactive_clients = last_purchase_date[last_purchase_date < pd.to_datetime('today') - pd.DateOffset(days=90)]

# Count the number of inactive clients
inactive_clients_count = inactive_clients.shape[0]

# Sort inactive clients by their last purchase date
inactive_clients_sorted = inactive_clients.sort_values()

# Print the count and sorted list of inactive clients
print(f"Number of clients with no purchase in over 90 days: {inactive_clients_count}")
print("Sorted list of inactive clients:")

with pd.option_context('display.max_rows', None, 'display.max_columns', None):
    print(inactive_clients_sorted)
Number of clients with no purchase in over 90 days: 273
Sorted list of inactive clients:
Cliente
JKFERREIRA     2007-04-04
FAMM           2007-04-19
JARFLEX        2007-04-30
METSALVADOR    2007-05-18
GANADAL        2007-06-06
FORBAL         2007-06-12
HOFFMANN1      2007-06-12
UMBERTOBERT    2007-06-20
TECNOMETAL     2007-07-18
LINADALMORO    2007-08-09
IRMAOSLUVIS    2007-08-27
IRMAOSMOTA     2007-08-30
SULTORRES      2007-09-11
MDO            2007-10-05
DIMILANOPO     2007-10-11
IPE            2007-10-26
JRIND.2        2007-12-17
MDOLTDA        2008-01-04
BRANDA         2008-01-18
PROTECARTER    2008-01-18
JRIND.         2008-04-30
MILANOMOV      2008-05-28
KALIENT        2008-06-04
CCGL           2008-06-13
IECODESENVO    2008-06-25
UTIL-LINE      2008-06-25
MINERVA        2008-06-27
MULTIFER       2008-06-30
BRINDILUZ      2008-07-09
METALNOVA      2008-07-18
TESSAROIND     2008-08-19
SCHIFER        2008-10-03
GASTROLIDER    2008-10-15
RSCAXIAS       2008-10-30
REGIACOM       2008-10-30
DEMORE         2009-02-05
CONTRUBEL      2009-02-11
SUERJE         2009-03-24
PAG            2009-06-30
TUTTO          2009-06-30
METALBRIL      2009-08-26
FORMA          2009-09-18
INELFAIND      2009-10-21
RECHEPADIL     2009-10-29
MACEDOBIOND    2009-11-05
UNITECINDUS    2009-11-19
RUGERIMECR     2009-12-11
COBRA          2009-12-22
GILMARPEGOR    2010-01-13
SOFISA         2010-01-22
ATENA          2010-01-27
FAMCORP        2010-01-29
FRAMA          2010-03-11
SEG            2010-03-22
RODAROS        2010-03-22
SANMARCO       2010-03-24
GLOBOMIX       2010-03-24
TECHMASTER     2010-04-06
RODAROS1       2010-04-07
G3PLASTICOS    2010-04-12
QUADRILATERO   2010-04-23
METALBEL       2010-04-29
METMDBLTDA     2010-06-01
IVANCARNINO    2010-06-11
TATACOM        2010-06-14
CORTACO        2010-06-18
BLPMAQUINAS    2010-07-30
GAUER          2010-09-22
BKCONST        2010-09-22
CORDATEX       2010-09-23
MORKATA        2010-10-11
ACESITASERV    2010-10-18
AGROP.SCHIO    2010-10-27
GSDIND         2010-11-05
AGOSTINETTO    2010-11-25
GASTROLIDE     2010-11-25
GPER           2010-12-13
60MOSMANN      2010-12-13
ARQUITETARIA   2010-12-13
SUPRAMEC       2010-12-15
TEDESCOLTDA    2011-01-04
ZANBOR         2011-01-19
SCHIOLTDA      2011-01-19
ENVEL          2011-01-24
ESCOVASCRUZ    2011-03-16
ORQUIDEA       2011-03-17
MARTAN         2011-03-23
MULTIAR        2011-03-30
FIXAR          2011-03-30
IPR            2011-03-30
DAVAL          2011-04-01
JARDIM         2011-05-09
ATHENA         2011-05-09
ANGONESE       2011-05-11
REVAL          2011-05-18
SPOTSUL        2011-06-02
JAY            2011-06-16
THEPLACE       2011-07-11
PMP            2011-07-13
PLASTICENTE    2011-07-26
RAINE          2011-07-26
RGB            2011-08-11
KEKOACESS      2011-08-17
COMPACTIND     2011-08-23
CARLOSGOMES    2011-08-24
NZN            2011-08-29
MAVE           2011-09-05
DALMORO        2011-09-26
NAUTEC         2011-10-04
RESIDAINCOR    2011-10-24
REVALIND       2011-10-28
NONOFERRERO    2011-11-28
INCOMAQ        2012-01-27
KDM            2012-02-16
OXICORTE       2012-03-12
GENERALCOAT    2012-03-16
FURGOKIT'S     2012-03-21
TRACO          2012-03-26
GIJON          2012-04-20
DITALINDE      2012-04-24
RLG            2012-05-15
RODOV.SCHIO    2012-05-17
RS             2012-07-10
AGROPECSCHI    2012-08-01
AHJ            2012-11-07
RZMAQ          2012-11-23
VILLAFRANCA    2012-11-28
CIM            2012-12-10
GIACOMELLI     2012-12-18
ARCOIRISIN     2012-12-19
DOSULINDE      2013-01-04
ASSISTEMAQ     2013-01-29
SILDRE         2013-02-18
MILENIUMTR     2013-03-22
ANODILAR       2013-04-04
PLASLINK       2013-04-11
FONTANAMAQ     2013-05-13
METSISTEM      2013-05-31
KAE            2013-06-17
MECANICACAR    2013-06-17
CASTERSUL      2013-07-15
MOVIMENTO      2013-08-27
IBP            2013-08-28
GPANIZIND      2013-09-12
SCHMITTUTIL    2013-09-13
CANELLO        2013-10-01
METALFORM      2013-11-19
MICHELEHAAB    2013-12-02
ACOBRASIL      2013-12-03
IBRAL          2013-12-10
MALTAIND       2013-12-10
CRICELMONT     2013-12-12
COPRIMA        2013-12-18
RODAROSIND     2014-01-27
CTRESIND       2014-01-30
DANFERLTDA     2014-02-28
MAGNUMETALU    2014-05-20
BENFATI        2014-06-02
INCORPOL       2014-06-03
METCECHINAT    2014-06-03
RDINDECOM      2014-06-09
LTMET          2014-06-13
MAACESS        2014-06-18
SAOMARCOSL     2014-06-27
ACOGRATO       2014-07-14
ANTONIOTEGN    2014-08-08
GIGIOIND       2014-08-13
HYVADOBRAS     2014-08-29
MENEGOTTO      2014-08-29
IMPLYTECNOLO   2014-09-22
STEFFENSIND    2014-10-10
METALCUBAS     2014-10-14
DUPARCEMPRE    2014-11-04
LAIND          2014-11-06
RBETIOLO       2014-11-27
MRACARTOE      2014-12-03
POMMIER        2015-01-29
CADERODE       2015-03-09
BORGHETTI      2015-03-16
TECNIARTE      2015-03-18
REBITSUL       2015-03-27
MULTISERVSE    2015-04-09
UNYPERINDUS    2015-04-13
RODAROSIND2    2015-06-10
BASECOMPONE    2015-07-01
PARTS          2015-07-21
TRONCONTROL    2015-09-23
ANDREMODENA    2015-10-19
MRPLASTDO      2015-10-20
D"ZAINER       2015-11-12
RAVINOXMETA    2016-01-27
PRONATTOEQU    2016-03-21
ATIVICON       2016-04-18
IMZOLET        2016-05-17
METALLIACOS    2016-06-07
FAMERTEC       2016-06-10
FABBOF         2016-06-27
GPANIZ         2016-08-01
ROLEJU         2016-08-09
ASP            2016-08-11
PROMATE        2016-08-23
TREGA          2017-09-14
DALE           2017-09-29
EDREAZA        2017-10-23
LUZI           2017-10-24
JMARCONIND     2018-01-10
VECTOR         2018-01-11
RODARE         2018-02-01
SCARIOTMET     2018-02-26
TECNOFRIO      2018-02-28
RD             2018-03-29
ROAL           2018-04-04
SUPERACOIND    2018-05-23
LCA            2018-07-30
LUNA           2018-12-03
ENIOSCARIOT    2019-02-15
ARMARINHOS     2019-02-18
M7COMERCIO     2019-03-08
D.M.VIANA      2019-03-26
EXATAENGENH    2019-03-26
LEAFARLOGIS    2019-05-31
MULTTECNICA    2019-06-03
FXOEIRELI      2019-06-13
BORTOLOTTO     2019-07-24
JOSECELSO      2019-08-27
TRG            2019-08-30
ACO3D          2019-09-09
SUNWAVEIN      2019-09-10
FERNANDA       2019-09-17
LOHR           2019-09-19
NOVAGERACA     2019-09-26
ARSILVA        2019-10-17
QUADRITECH     2019-10-30
BSBCONSTRUC    2019-11-28
AGGYINDUST     2019-12-06
DARDOCOMERC    2019-12-12
GEDOZ          2020-02-18
GEETECEQUIP    2020-02-19
NOVOPAPAGAI    2020-02-20
JOPEMAR        2020-03-16
L.MARQUEZZO    2020-05-04
MS-ENGENH      2020-07-28
ANHANGUERA     2020-07-28
AMMINDDE       2020-08-18
CIKLO          2020-10-21
DOMPEL         2020-12-21
CEMTRA         2021-04-13
GAUERAUTOPE    2021-05-04
BRIMEL         2021-06-30
METAISWIZET    2021-07-02
CJINDUST       2021-09-13
AGROBENE       2021-09-29
ENGATCAR       2021-11-19
PERFILLINE     2021-11-22
METALEX        2022-05-19
GUARANY        2022-06-29
BEMFATTO       2022-08-10
EXPRESSOVR     2022-10-19
UNIFERRO       2022-10-27
CRESPAR        2022-11-22
CAMERA         2022-12-22
PHTRANS        2023-02-01
G3INDUSTRIA    2023-04-05
GS             2023-04-13
VIEMME         2023-05-15
RALKY          2023-05-22
ALCASTS/A      2023-05-31
CIRNA          2023-07-19
METCOSBI       2023-08-09
ALCAST         2023-08-22
SASPLASTI      2023-08-31
ACOPLANO       2023-08-31
SCARELI        2023-09-04
Name: Data, dtype: datetime64[ns]

7 Conclusão¶

Ao visualizar os dados, podemos obter uma compreensão mais profunda de sua distribuição em diferentes variáveis. Podemos examinar como as vendas se concentram em tipos específicos de produtos e espessuras, além de observar a variação de preço e volume ao longo do tempo. Percebemos uma correlação direta entre a taxa de câmbio do dólar o preço das matérias-primas. No entanto, para obter uma compreensão mais abrangente, seria benéfico incorporar outras variáveis econômicas e fatores adicionais de análise e predição, que possam servir como indicadores de flutuações de preços, problemas finaceiros e probabilidade de vendas.

Percebemos uma diminuição no volume das vendas de chapas que impactam diretamente o desempenho e embora não seja esplicito no relatório, a queda se deve, principalmente, a problemas financeiros e ao fechamento de empresas na Região, dentre elas, Rodare, Rodaros, Hidro Jet, Keko, Moferko, Perfilline, Metalcin, Engatcar, Vector, Luna...